home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / preconv.s < prev    next >
Text File  |  2000-01-10  |  49KB  |  2,002 lines

  1.     .include    fefunc.h
  2.     .include    global.mac
  3.     .include    preconv.mac
  4.  
  5. ;----------------------------------------------------------------
  6. ;バスブースター
  7. ;    現在のポイントのPCMの値に2^BASS_INPUT_SHIFT_LEFTを掛け,
  8. ;    現在のポイントの前後合わせてBASS_RING_SAMPLE個のPCMの値の合計を加え,
  9. ;    2^BASS_OUTPUT_SHIFT_RIGHTで割る.
  10. BASS_RING_SAMPLE    equ    95    ;中央の値が必要なので奇数にすること
  11. BASS_INPUT_SHIFT_LEFT    equ    6
  12. BASS_OUTPUT_SHIFT_RIGHT    equ    6
  13.  
  14.     .fail    (BASS_RING_SAMPLE.and.1)=0
  15.  
  16. BASS_RING_SIZE    equ    4*BASS_RING_SAMPLE
  17.  
  18. ;----------------------------------------------------------------
  19. ;ハイカットフィルタ
  20. ;    現在のポイントの前後合わせてHICUT_RING_SAMPLE個のPCMの値の合計を
  21. ;    2^HICUT_OUTPUT_SHIFT_RIGHTで割る.
  22. HICUT_RING_SAMPLE    equ    4    ;中央の値は不要なので奇数でなくてよい
  23. HICUT_OUTPUT_SHIFT_RIGHT    equ    2
  24.  
  25. HICUT_RING_SIZE    equ    4*HICUT_RING_SAMPLE
  26.  
  27.  
  28. ;----------------------------------------------------------------
  29. ;----------------------------------------------------------------
  30. ;PCMデータの前処理(PCMデータをOPMのTLの並びに変換する)の初期化
  31.     .text
  32.     .align    4,$2048
  33. init_preconv::
  34.     movem.l    d0-d1/a0,-(sp)
  35.  
  36. *    clr.l    preconv_dat_0
  37.     clr.l    preconv_dat_1
  38.     clr.l    preconv_dat_2
  39. *    clr.w    preconv_pre_0
  40.     clr.w    preconv_pre_1
  41.     clr.w    preconv_pre_2
  42. *    move.w    #$8000,preconv_for_0
  43.     move.w    #$8000,preconv_for_1
  44.     move.w    #$8000,preconv_for_2
  45. *    move.w    #$8000,preconv_bak_0
  46.     move.w    #$8000,preconv_bak_1
  47.     move.w    #$8000,preconv_bak_2
  48. *    clr.l    preconv_jmp_0
  49.     clr.l    preconv_jmp_1
  50.     clr.l    preconv_jmp_2
  51.  
  52.  
  53.     tst.b    adpcm_data_flag
  54.     bne    19f
  55.     tst.b    fmp_data_flag
  56.     bne    19f
  57.     tst.b    cdxa_data_flag
  58.     bne    19f
  59.     tst.b    xx_data_flag
  60.     bne    19f
  61.  
  62.     tst.b    bass_flag
  63.     beq    9f
  64.     move.l    #bass_ring_buffer,preconv_bass_rngred
  65.     move.l    #bass_ring_buffer+BASS_RING_SIZE/2,preconv_bass_rngwrt
  66.     clr.l    preconv_bass_left
  67.     clr.l    preconv_bass_right
  68.     lea.l    bass_ring_buffer,a0
  69.     moveq.l    #0,d0
  70.     move.l    #BASS_RING_SIZE/4-1,d1
  71.     swap.w    d1
  72. 2:    swap.w    d1
  73. 1:    move.l    d0,(a0)+
  74.     dbra    d1,1b
  75.     swap.w    d1
  76.     dbra    d1,2b
  77.     lea.l    (m_use_bass,pc),a0
  78.     bsr    silent_eprintcrlf
  79. 9:
  80.  
  81.     tst.b    hicut_flag
  82.     beq    9f
  83.     move.l    #hicut_ring_buffer,preconv_hicut_rngred
  84.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE/2,preconv_hicut_rngwrt
  85.     clr.l    preconv_hicut_left
  86.     clr.l    preconv_hicut_right
  87.     lea.l    hicut_ring_buffer,a0
  88.     moveq.l    #0,d0
  89.     move.l    #HICUT_RING_SIZE/4-1,d1
  90.     swap.w    d1
  91. 2:    swap.w    d1
  92. 1:    move.l    d0,(a0)+
  93.     dbra    d1,1b
  94.     swap.w    d1
  95.     dbra    d1,2b
  96.     lea.l    (m_use_hicut,pc),a0
  97.     bsr    silent_eprintcrlf
  98. 9:
  99.  
  100. 19:
  101.  
  102.  
  103. *    clr.l    preconv_scnt_0
  104.     clr.l    preconv_scnt_1
  105.     move.l    output_frequency,d0    ;出力側のサンプリング周波数
  106.     FPACK    __LTOF
  107.     move.l    d0,d1
  108.     move.l    data_frequency,d0    ;入力側のサンプリング周波数
  109.     FPACK    __LTOF
  110.     add.l    #$08000000,d0        ;65536倍
  111.     FPACK    __FDIV
  112.     FPACK    __FTOL            ;入力側のサンプリング周波数
  113.                     ;    /出力側のサンプリング周波数*65536
  114.     move.l    d0,speed_rate
  115.     lsr.l    #1,d0
  116.     move.l    d0,preconv_scnt_2
  117.     clr.w    preconv_rest_1
  118.     clr.w    preconv_rest_2
  119.  
  120. ;-sqで使う定数
  121. ;2^(n-1)<=@srat<2^nとなるnを求める
  122.     move.l    speed_rate,d0
  123.     moveq.l    #32,d1
  124. @@:    add.l    d0,d0
  125.     dbcs    d1,@b            ;speed_rateは0ではないので必ず途中で止まる
  126.     move.w    d1,sq_n            ;n
  127.     sub.w    #16,d1
  128.     move.w    d1,sq_n_16        ;n-16
  129. ;2^(n+14)/speed_rateを求める
  130.     move.l    speed_rate,d0
  131.     FPACK    __LTOF
  132.     move.l    d0,d1
  133.     move.w    sq_n,d0
  134.     add.w    #$7F+14,d0
  135.     lsl.w    #7,d0
  136.     swap.w    d0
  137.     clr.w    d0            ;2^(n+14)
  138.     FPACK    __FDIV
  139.     FPACK    __FTOL
  140.     move.w    d0,sq_inv        ;2^(n+14)/speed_rate
  141.  
  142.  
  143. ;ADPCM
  144.     tst.b    adpcm_data_flag
  145.     beq    @f
  146.     bsr    init_adpcm
  147. @@:
  148.  
  149.  
  150.     tst.b    xx_data_flag
  151.     beq    @f
  152.     clr.l    left1
  153.     clr.l    left2
  154.     clr.l    right1
  155.     clr.l    right2
  156. @@:
  157.  
  158.  
  159.     tst.b    silent_flag
  160.     bne    9f
  161.     lea.l    (m_frequency_1,pc),a0
  162.     bsr    eprint
  163.     move.l    data_frequency,d0    ;入力側のサンプリング周波数
  164.     bsr    utos_eprint
  165.     lea.l    (m_frequency_2,pc),a0
  166.     bsr    eprint
  167.     lea.l    (m_mono,pc),a0
  168.     tst.b    mono_data_flag
  169.     bne    @f
  170.     lea.l    (m_stereo,pc),a0
  171. @@:    bsr    eprint
  172.     lea.l    (m_frequency_3,pc),a0
  173.     bsr    eprint
  174.     tst.b    fmp_data_flag
  175.     bne    8f
  176.     lea.l    (m_frequency_4,pc),a0
  177.     bsr    eprint
  178.     move.l    output_frequency,d0    ;出力側のサンプリング周波数
  179.     bsr    utos_eprint
  180.     lea.l    (m_frequency_2,pc),a0
  181.     bsr    eprint
  182.     lea.l    (m_mono,pc),a0
  183.     tst.b    mono_play_flag
  184.     bne    @f
  185.     lea.l    (m_stereo,pc),a0
  186. @@:    bsr    eprint
  187.     lea.l    (m_frequency_3,pc),a0
  188.     bsr    eprint
  189.     lea.l    (m_frequency_5,pc),a0
  190.     bsr    eprint
  191.     lea.l    (m_low_quality,pc),a0
  192.     move.b    data_quality,d0
  193.     beq    @f
  194.     lea.l    (m_high_quality,pc),a0
  195.     subq.b    #1,d0
  196.     beq    @f
  197.     lea.l    (m_super_quality,pc),a0
  198. @@:    bsr    eprint
  199.     lea.l    (m_frequency_6,pc),a0
  200.     bsr    eprint
  201. 8:    bsr    ecrlf
  202. 9:
  203. ;
  204.     movem.l    (sp)+,d0-d1/a0
  205.     rts
  206.  
  207. m_use_bass:        .dc.b    'バスブースターを使用します',0
  208. m_use_hicut:        .dc.b    'ハイカットフィルタを使用します',0
  209. m_frequency_1:        .dc.b    'サンプリング周波数: ',0
  210. m_frequency_2:        .dc.b    'Hz(',0
  211. m_frequency_3:        .dc.b    ')',0
  212. m_frequency_4:        .dc.b    ' → ',0
  213. m_frequency_5:        .dc.b    ' <',0
  214. m_frequency_6:        .dc.b    '>',0
  215. m_mono:            .dc.b    'Mono',0
  216. m_stereo:        .dc.b    'Stereo',0
  217. m_low_quality:        .dc.b    'Low Quality',0
  218. m_high_quality:        .dc.b    'High Quality',0
  219. m_super_quality:    .dc.b    'Super Quality',0
  220.     .even
  221.  
  222.     .bss
  223.     .align    4
  224. preconv_dat_0::
  225. preconv_dat_1::        .ds.l    1
  226. preconv_dat_2::        .ds.l    1
  227.     .even
  228. preconv_pre_0::
  229. preconv_pre_1::        .ds.w    1
  230. preconv_pre_2::        .ds.w    1
  231. preconv_for_0::
  232. preconv_for_1::        .ds.w    1
  233. preconv_for_2::        .ds.w    1
  234. preconv_bak_0::
  235. preconv_bak_1::        .ds.w    1
  236. preconv_bak_2::        .ds.w    1
  237.  
  238.     .align    4
  239. preconv_jmp_0::
  240. preconv_jmp_1::        .ds.l    1
  241. preconv_jmp_2::        .ds.l    1
  242.  
  243.     .align    4
  244. preconv_scnt_0::
  245. preconv_scnt_1::    .ds.l    1
  246. preconv_scnt_2::    .ds.l    1
  247. speed_rate::        .ds.l    1    ;入力側のサンプリング周波数
  248.                     ;    /出力側のサンプリング周波数*65536
  249.                     ;周波数が上がる=間隔が短くなるとき65536より小さい
  250.                     ;周波数が下がる=間隔が長くなるとき65536より大きい
  251.     .even
  252. preconv_rest_1::    .ds.b    1    ;0=left繰り越しなし,-1=left繰り越しあり
  253.             .ds.b    1    ;left繰り越しデータ
  254. preconv_rest_2::    .ds.b    1    ;0=right繰り越しなし,-1=right繰り越しあり
  255.             .ds.b    1    ;right繰り越しデータ
  256. ;-sq
  257.     .even
  258. sq_n::            .ds.w    1    ;n
  259. sq_n_16::        .ds.w    1    ;n-16
  260. sq_inv::        .ds.w    1    ;2^(n+14)/speed_rate
  261.  
  262.     .bss
  263.     .align    4
  264. left1::            .ds.l    1    ;1つ前のleftのデータ
  265. left2::            .ds.l    1    ;2つ前のleftのデータ
  266. right1::        .ds.l    1    ;1つ前のrightのデータ
  267. right2::        .ds.l    1    ;2つ前のrightのデータ
  268.  
  269. ;----------------------------------------------------------------
  270. ;    Signed-16bit整数同士を足して2で割る
  271. ;    +    +    vs,cc    0を押し込んで右シフト(lsr)
  272. ;    +    +    vc    asr
  273. ;    +    -    vc    asr
  274. ;    -    +    vc    asr
  275. ;    -    -    vc    asr
  276. ;    -    -    vs,cs    1を押し込んで右シフト
  277. ;----------------------------------------------------------------
  278. ;----------------------------------------------------------------
  279. ;PCMデータの前処理(PCMデータをOPMのTLの並びに変換する)
  280. ;<a0.l:出力バッファの先頭
  281. ;<a1.l:入力データの先頭
  282. ;<a2.l:入力データの末尾+1
  283. ;>a0.l:出力データの末尾+1
  284. ;>a1.l:出力データの先頭
  285. ;?d1-d7/a2-a6
  286.     .text
  287.  
  288. ;----------------------------------------------------------------
  289. ;ノーマル
  290.  
  291. START_PRECONV_BUFFER    .macro    side
  292.     movea.l    preconv_dst_top_ptr,Adst
  293.     movea.l    preconv_src_cur_ptr,Asrc
  294.     movea.l    preconv_src_lim_ptr,Alim
  295.     .endm
  296.  
  297. LOOP_PRECONV_BUFFER    .macro    side
  298.     .endm
  299.  
  300. ;ステレオ→ステレオ,16bit,big-endian
  301. GET_DATA_1    .macro    src,dat,tmp
  302.     move.w    (src)+,dat
  303.     addq.l    #2,src
  304.     .endm
  305.  
  306. GET_DATA_2    .macro    src,dat,tmp
  307.     addq.l    #2,src
  308.     move.w    (src)+,dat
  309.     .endm
  310.  
  311.   .irp %q,LQ,HQ,SQ
  312.     .text
  313.     .align    4,$2048
  314. preconv_ss16b_stereo_%q::
  315.     move.l    a0,preconv_dst_top_ptr
  316.     move.l    a1,preconv_src_cur_ptr
  317.     move.l    a2,preconv_src_lim_ptr
  318.     PRECONV_STEREO_%q
  319.     movea.l    preconv_dst_top_ptr,a1
  320.     rts
  321.   .endm
  322.  
  323. ;ステレオ→モノラル,16bit,big-endian
  324. GET_DATA_0    .macro    src,dat,tmp
  325.     move.w    (src)+,dat
  326.     add.w    (src)+,dat
  327.     bvc    @skip
  328. @over:
  329.     roxr.w    #1,dat            ;常にvc
  330.     bra    @done
  331. @skip:
  332.     asr.w    #1,dat            ;常にvc
  333. @done:
  334.     .endm
  335.  
  336.   .irp %q,LQ,HQ,SQ
  337.     .text
  338.     .align    4,$2048
  339. preconv_ss16b_mono_%q::
  340.     move.l    a0,preconv_dst_top_ptr
  341.     move.l    a1,preconv_src_cur_ptr
  342.     move.l    a2,preconv_src_lim_ptr
  343.     PRECONV_MONO_%q
  344.     movea.l    preconv_dst_top_ptr,a1
  345.     rts
  346.   .endm
  347.  
  348. ;モノラル→モノラル,16bit,big-endian
  349. GET_DATA_0    .macro    src,dat,tmp
  350.     move.w    (src)+,dat        ;常にvc
  351.     .endm
  352.  
  353.   .irp %q,LQ,HQ,SQ
  354.     .text
  355.     .align    4,$2048
  356. preconv_ms16b_mono_%q::
  357.     move.l    a0,preconv_dst_top_ptr
  358.     move.l    a1,preconv_src_cur_ptr
  359.     move.l    a2,preconv_src_lim_ptr
  360.     PRECONV_MONO_%q
  361.     movea.l    preconv_dst_top_ptr,a1
  362.     rts
  363.   .endm
  364.  
  365. ;ステレオ→ステレオ,16bit,little-endian
  366. GET_DATA_1    .macro    src,dat,tmp
  367.     move.w    (src)+,dat
  368.     rol.w    #8,dat
  369.     addq.l    #2,src
  370.     .endm
  371.  
  372. GET_DATA_2    .macro    src,dat,tmp
  373.     addq.l    #2,src
  374.     move.w    (src)+,dat
  375.     rol.w    #8,dat
  376.     .endm
  377.  
  378.   .irp %q,LQ,HQ,SQ
  379.     .text
  380.     .align    4,$2048
  381. preconv_ss16l_stereo_%q::
  382.     .if TEST_68000
  383.     bra    preconv_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  384.     .else
  385.     IS68000    d0
  386.     beq    preconv_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  387.     .endif
  388.     move.l    a0,preconv_dst_top_ptr
  389.     move.l    a1,preconv_src_cur_ptr
  390.     move.l    a2,preconv_src_lim_ptr
  391.     PRECONV_STEREO_%q
  392.     movea.l    preconv_dst_top_ptr,a1
  393.     rts
  394.   .endm
  395.  
  396. ;ステレオ→モノラル,16bit,little-endian
  397. GET_DATA_0    .macro    src,dat,tmp
  398.     move.w    (src)+,dat
  399.     move.w    (src)+,tmp
  400.     rol.w    #8,dat
  401.     rol.w    #8,tmp
  402.     add.w    tmp,dat
  403.     bvc    @skip
  404. @over:
  405.     roxr.w    #1,dat            ;常にvc
  406.     bra    @done
  407. @skip:
  408.     asr.w    #1,dat            ;常にvc
  409. @done:
  410.     .endm
  411.  
  412.   .irp %q,LQ,HQ,SQ
  413.     .text
  414.     .align    4,$2048
  415. preconv_ss16l_mono_%q::
  416.     .if TEST_68000
  417.     bra    preconv_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  418.     .else
  419.     IS68000    d0
  420.     beq    preconv_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  421.     .endif
  422.     move.l    a0,preconv_dst_top_ptr
  423.     move.l    a1,preconv_src_cur_ptr
  424.     move.l    a2,preconv_src_lim_ptr
  425.     PRECONV_MONO_%q
  426.     movea.l    preconv_dst_top_ptr,a1
  427.     rts
  428.   .endm
  429.  
  430. ;モノラル→モノラル,16bit,little-endian
  431. GET_DATA_0    .macro    src,dat,tmp
  432.     move.w    (src)+,dat
  433.     rol.w    #8,dat            ;常にvc
  434.     .endm
  435.  
  436.   .irp %q,LQ,HQ,SQ
  437.     .text
  438.     .align    4,$2048
  439. preconv_ms16l_mono_%q::
  440.     .if TEST_68000
  441.     bra    preconv_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  442.     .else
  443.     IS68000    d0
  444.     beq    preconv_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  445.     .endif
  446.     move.l    a0,preconv_dst_top_ptr
  447.     move.l    a1,preconv_src_cur_ptr
  448.     move.l    a2,preconv_src_lim_ptr
  449.     PRECONV_MONO_%q
  450.     movea.l    preconv_dst_top_ptr,a1
  451.     rts
  452.   .endm
  453.  
  454. ;FMPフォーマット(変換する必要がない)
  455.   .irp %q,LQ,HQ,SQ
  456.     .text
  457.     .align    4,$2048
  458. preconv_sfmp_stereo_%q::
  459. preconv_sfmp_mono_%q::
  460. preconv_mfmp_mono_%q::
  461.     movea.l    a2,a0
  462. *    movea.l    a1,a1
  463.     rts
  464.   .endm
  465.  
  466.     .bss
  467.     .align    4
  468. preconv_dst_top_ptr::    .ds.l    1
  469. preconv_src_cur_ptr::    .ds.l    1
  470. preconv_src_lim_ptr::    .ds.l    1
  471.  
  472. ;----------------------------------------------------------------
  473. ;バスブースター
  474.  
  475. START_PRECONV_BUFFER    .macro    side
  476.  
  477.   .if side<2
  478.  
  479. @Ddat    reg    Ddat    ;データ
  480. @Dtmp    reg    Dtmp    ;テンポラリ
  481. @Adatlim    reg    Alim    ;データの末尾
  482. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  483. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  484. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  485. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  486. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  487. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  488. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  489. @Rmin    reg    Rsrat    ;-32768
  490. @Rmax    reg    Rsone    ;32767
  491.  
  492.     movea.l    preconv_src_lim_ptr,@Adatlim
  493.     movea.l    preconv_src_cur_ptr,@Adatptr
  494.     movea.l    preconv_bass_rngred,@Arngred
  495.     movea.l    preconv_bass_rngwrt,@Arngwrt
  496.     move.l    #bass_ring_buffer,@Rrngtop
  497.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  498.     move.l    preconv_bass_left,@Dleft
  499.     move.l    preconv_bass_right,@Dright
  500.     move.l    #-32768,@Rmin
  501.     move.l    #32767,@Rmax
  502. @_10:
  503. ;left
  504.     move.w    (@Arngwrt),@Ddat
  505.     ext.l    @Ddat
  506.     sub.l    @Ddat,@Dleft
  507.     move.w    (@Adatptr),@Ddat
  508.     ext.l    @Ddat
  509.     add.l    @Ddat,@Dleft
  510.     move.w    @Ddat,(@Arngwrt)+
  511.     move.w    (@Arngred)+,@Ddat
  512.     ext.l    @Ddat
  513.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  514.     add.l    @Dleft,@Ddat
  515.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  516.     cmp.l    @Rmin,@Ddat
  517.     bge    @f
  518.     move.l    @Rmin,@Ddat
  519. @@:    cmp.l    @Rmax,@Ddat
  520.     ble    @f
  521.     move.l    @Rmax,@Ddat
  522. @@:
  523.     move.w    @Ddat,(@Adatptr)+
  524. ;right
  525.     move.w    (@Arngwrt),@Ddat
  526.     ext.l    @Ddat
  527.     sub.l    @Ddat,@Dright
  528.     move.w    (@Adatptr),@Ddat
  529.     ext.l    @Ddat
  530.     add.l    @Ddat,@Dright
  531.     move.w    @Ddat,(@Arngwrt)+
  532.     move.w    (@Arngred)+,@Ddat
  533.     ext.l    @Ddat
  534.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  535.     add.l    @Dleft,@Ddat
  536.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  537.     cmp.l    @Rmin,@Ddat
  538.     bge    @f
  539.     move.l    @Rmin,@Ddat
  540. @@:    cmp.l    @Rmax,@Ddat
  541.     ble    @f
  542.     move.l    @Rmax,@Ddat
  543. @@:
  544.     move.w    @Ddat,(@Adatptr)+
  545. ;
  546.     cmpa.l    @Rrngbtm,@Arngred
  547.     blo    @f
  548.     movea.l    @Rrngtop,@Arngred
  549. @@:
  550. ;
  551.     cmpa.l    @Rrngbtm,@Arngwrt
  552.     blo    @f
  553.     movea.l    @Rrngtop,@Arngwrt
  554. @@:
  555. ;
  556.     cmpa.l    @Adatlim,@Adatptr
  557.     blo    @_10
  558. ;
  559.     move.l    @Arngred,preconv_bass_rngred
  560.     move.l    @Arngwrt,preconv_bass_rngwrt
  561.     move.l    @Dleft,preconv_bass_left
  562.     move.l    @Dright,preconv_bass_right
  563. ;
  564.   .endif
  565. ;
  566.     movea.l    preconv_dst_top_ptr,Adst
  567.     movea.l    preconv_src_cur_ptr,Asrc
  568.     movea.l    preconv_src_lim_ptr,Alim
  569.     .endm
  570.  
  571. LOOP_PRECONV_BUFFER    .macro    side
  572.     .endm
  573.  
  574. ;ステレオ→ステレオ,16bit,big-endian
  575. GET_DATA_1    .macro    src,dat,tmp
  576.     move.w    (src)+,dat
  577.     addq.l    #2,src
  578.     .endm
  579.  
  580. GET_DATA_2    .macro    src,dat,tmp
  581.     addq.l    #2,src
  582.     move.w    (src)+,dat
  583.     .endm
  584.  
  585.   .irp %q,LQ,HQ,SQ
  586.     .text
  587.     .align    4,$2048
  588. preconv_bass_ss16b_stereo_%q::
  589.     move.l    a0,preconv_dst_top_ptr
  590.     move.l    a1,preconv_src_cur_ptr
  591.     move.l    a2,preconv_src_lim_ptr
  592.     PRECONV_STEREO_%q
  593.     movea.l    preconv_dst_top_ptr,a1
  594.     rts
  595.   .endm
  596.  
  597.  
  598. START_PRECONV_BUFFER    .macro    side
  599.  
  600. @Ddat    reg    Ddat    ;データ
  601. @Dtmp    reg    Dtmp    ;テンポラリ
  602. @Adatlim    reg    Alim    ;データの末尾
  603. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  604. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  605. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  606. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  607. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  608. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  609. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  610. @Rmin    reg    Rsrat    ;-32768
  611. @Rmax    reg    Rsone    ;32767
  612.  
  613.     movea.l    preconv_src_lim_ptr,@Adatlim
  614.     movea.l    preconv_src_cur_ptr,@Adatptr
  615.     movea.l    preconv_bass_rngred,@Arngred
  616.     movea.l    preconv_bass_rngwrt,@Arngwrt
  617.     move.l    #bass_ring_buffer,@Rrngtop
  618.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  619.     move.l    preconv_bass_left,@Dleft
  620.     move.l    #-32768,@Rmin
  621.     move.l    #32767,@Rmax
  622. @_10:
  623. ;left
  624.     move.w    (@Arngwrt),@Ddat
  625.     ext.l    @Ddat
  626.     sub.l    @Ddat,@Dleft
  627.     move.w    (@Adatptr),@Ddat
  628.     add.w    (2,@Adatptr),@Ddat
  629.     bvc    @_11
  630.     roxr.w    #1,@Ddat
  631.     bra    @_12
  632. @_11:
  633.     asr.w    #1,@Ddat
  634. @_12:
  635.     ext.l    @Ddat
  636.     add.l    @Ddat,@Dleft
  637.     move.w    @Ddat,(@Arngwrt)+
  638.     move.w    (@Arngred)+,@Ddat
  639.     ext.l    @Ddat
  640.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  641.     add.l    @Dleft,@Ddat
  642.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  643.     cmp.l    @Rmin,@Ddat
  644.     bge    @f
  645.     move.l    @Rmin,@Ddat
  646. @@:    cmp.l    @Rmax,@Ddat
  647.     ble    @f
  648.     move.l    @Rmax,@Ddat
  649. @@:
  650.     move.w    @Ddat,(@Adatptr)+
  651. ;
  652.     addq.l    #2,@Arngred
  653.     addq.l    #2,@Arngwrt
  654.     addq.l    #2,@Adatptr
  655. ;
  656.     cmpa.l    @Rrngbtm,@Arngred
  657.     blo    @f
  658.     movea.l    @Rrngtop,@Arngred
  659. @@:
  660. ;
  661.     cmpa.l    @Rrngbtm,@Arngwrt
  662.     blo    @f
  663.     movea.l    @Rrngtop,@Arngwrt
  664. @@:
  665. ;
  666.     cmpa.l    @Adatlim,@Adatptr
  667.     blo    @_10
  668. ;
  669.     move.l    @Arngred,preconv_bass_rngred
  670.     move.l    @Arngwrt,preconv_bass_rngwrt
  671.     move.l    @Dleft,preconv_bass_left
  672. ;
  673.     movea.l    preconv_dst_top_ptr,Adst
  674.     movea.l    preconv_src_cur_ptr,Asrc
  675.     movea.l    preconv_src_lim_ptr,Alim
  676.     .endm
  677.  
  678. LOOP_PRECONV_BUFFER    .macro    side
  679.     .endm
  680.  
  681. ;ステレオ→モノラル,16bit,big-endian
  682. GET_DATA_0    .macro    src,dat,tmp
  683.     move.w    (src)+,dat
  684.     addq.l    #2,src
  685.     .endm
  686.  
  687.   .irp %q,LQ,HQ,SQ
  688.     .text
  689.     .align    4,$2048
  690. preconv_bass_ss16b_mono_%q::
  691.     move.l    a0,preconv_dst_top_ptr
  692.     move.l    a1,preconv_src_cur_ptr
  693.     move.l    a2,preconv_src_lim_ptr
  694.     PRECONV_MONO_%q
  695.     movea.l    preconv_dst_top_ptr,a1
  696.     rts
  697.   .endm
  698.  
  699.  
  700. START_PRECONV_BUFFER    .macro    side
  701.  
  702. @Ddat    reg    Ddat    ;データ
  703. @Dtmp    reg    Dtmp    ;テンポラリ
  704. @Adatlim    reg    Alim    ;データの末尾
  705. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  706. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  707. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  708. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  709. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  710. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  711. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  712. @Rmin    reg    Rsrat    ;-32768
  713. @Rmax    reg    Rsone    ;32767
  714.  
  715.     movea.l    preconv_src_lim_ptr,@Adatlim
  716.     movea.l    preconv_src_cur_ptr,@Adatptr
  717.     movea.l    preconv_bass_rngred,@Arngred
  718.     movea.l    preconv_bass_rngwrt,@Arngwrt
  719.     move.l    #bass_ring_buffer,@Rrngtop
  720.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  721.     move.l    preconv_bass_left,@Dleft
  722.     move.l    #-32768,@Rmin
  723.     move.l    #32767,@Rmax
  724. @_10:
  725. ;left
  726.     move.w    (@Arngwrt),@Ddat
  727.     ext.l    @Ddat
  728.     sub.l    @Ddat,@Dleft
  729.     move.w    (@Adatptr),@Ddat
  730.     ext.l    @Ddat
  731.     add.l    @Ddat,@Dleft
  732.     move.w    @Ddat,(@Arngwrt)+
  733.     move.w    (@Arngred)+,@Ddat
  734.     ext.l    @Ddat
  735.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  736.     add.l    @Dleft,@Ddat
  737.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  738.     cmp.l    @Rmin,@Ddat
  739.     bge    @f
  740.     move.l    @Rmin,@Ddat
  741. @@:    cmp.l    @Rmax,@Ddat
  742.     ble    @f
  743.     move.l    @Rmax,@Ddat
  744. @@:
  745.     move.w    @Ddat,(@Adatptr)+
  746. ;
  747.     addq.l    #2,@Arngred
  748.     addq.l    #2,@Arngwrt
  749.     addq.l    #2,@Adatptr
  750. ;
  751.     cmpa.l    @Rrngbtm,@Arngred
  752.     blo    @f
  753.     movea.l    @Rrngtop,@Arngred
  754. @@:
  755. ;
  756.     cmpa.l    @Rrngbtm,@Arngwrt
  757.     blo    @f
  758.     movea.l    @Rrngtop,@Arngwrt
  759. @@:
  760. ;
  761.     cmpa.l    @Adatlim,@Adatptr
  762.     blo    @_10
  763. ;
  764.     move.l    @Arngred,preconv_bass_rngred
  765.     move.l    @Arngwrt,preconv_bass_rngwrt
  766.     move.l    @Dleft,preconv_bass_left
  767. ;
  768.     movea.l    preconv_dst_top_ptr,Adst
  769.     movea.l    preconv_src_cur_ptr,Asrc
  770.     movea.l    preconv_src_lim_ptr,Alim
  771.     .endm
  772.  
  773. LOOP_PRECONV_BUFFER    .macro    side
  774.     .endm
  775.  
  776. ;モノラル→モノラル,16bit,big-endian
  777. GET_DATA_0    .macro    src,dat,tmp
  778.     move.w    (src)+,dat        ;常にvc
  779.     .endm
  780.  
  781.   .irp %q,LQ,HQ,SQ
  782.     .text
  783.     .align    4,$2048
  784. preconv_bass_ms16b_mono_%q::
  785.     move.l    a0,preconv_dst_top_ptr
  786.     move.l    a1,preconv_src_cur_ptr
  787.     move.l    a2,preconv_src_lim_ptr
  788.     PRECONV_MONO_%q
  789.     movea.l    preconv_dst_top_ptr,a1
  790.     rts
  791.   .endm
  792.  
  793.  
  794. START_PRECONV_BUFFER    .macro    side
  795.  
  796.   .if side<2
  797.  
  798. @Ddat    reg    Ddat    ;データ
  799. @Dtmp    reg    Dtmp    ;テンポラリ
  800. @Adatlim    reg    Alim    ;データの末尾
  801. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  802. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  803. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  804. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  805. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  806. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  807. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  808. @Rmin    reg    Rsrat    ;-32768
  809. @Rmax    reg    Rsone    ;32767
  810.  
  811.     movea.l    preconv_src_lim_ptr,@Adatlim
  812.     movea.l    preconv_src_cur_ptr,@Adatptr
  813.     movea.l    preconv_bass_rngred,@Arngred
  814.     movea.l    preconv_bass_rngwrt,@Arngwrt
  815.     move.l    #bass_ring_buffer,@Rrngtop
  816.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  817.     move.l    preconv_bass_left,@Dleft
  818.     move.l    preconv_bass_right,@Dright
  819.     move.l    #-32768,@Rmin
  820.     move.l    #32767,@Rmax
  821. @_10:
  822. ;left
  823.     move.w    (@Arngwrt),@Ddat
  824.     ext.l    @Ddat
  825.     sub.l    @Ddat,@Dleft
  826.     move.w    (@Adatptr),@Ddat
  827.     rol.w    #8,@Ddat
  828.     ext.l    @Ddat
  829.     add.l    @Ddat,@Dleft
  830.     move.w    @Ddat,(@Arngwrt)+
  831.     move.w    (@Arngred)+,@Ddat
  832.     ext.l    @Ddat
  833.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  834.     add.l    @Dleft,@Ddat
  835.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  836.     cmp.l    @Rmin,@Ddat
  837.     bge    @f
  838.     move.l    @Rmin,@Ddat
  839. @@:    cmp.l    @Rmax,@Ddat
  840.     ble    @f
  841.     move.l    @Rmax,@Ddat
  842. @@:
  843.     move.w    @Ddat,(@Adatptr)+
  844. ;right
  845.     move.w    (@Arngwrt),@Ddat
  846.     ext.l    @Ddat
  847.     sub.l    @Ddat,@Dright
  848.     move.w    (@Adatptr),@Ddat
  849.     rol.w    #8,@Ddat
  850.     ext.l    @Ddat
  851.     add.l    @Ddat,@Dright
  852.     move.w    @Ddat,(@Arngwrt)+
  853.     move.w    (@Arngred)+,@Ddat
  854.     ext.l    @Ddat
  855.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  856.     add.l    @Dleft,@Ddat
  857.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  858.     cmp.l    @Rmin,@Ddat
  859.     bge    @f
  860.     move.l    @Rmin,@Ddat
  861. @@:    cmp.l    @Rmax,@Ddat
  862.     ble    @f
  863.     move.l    @Rmax,@Ddat
  864. @@:
  865.     move.w    @Ddat,(@Adatptr)+
  866. ;
  867.     cmpa.l    @Rrngbtm,@Arngred
  868.     blo    @f
  869.     movea.l    @Rrngtop,@Arngred
  870. @@:
  871. ;
  872.     cmpa.l    @Rrngbtm,@Arngwrt
  873.     blo    @f
  874.     movea.l    @Rrngtop,@Arngwrt
  875. @@:
  876. ;
  877.     cmpa.l    @Adatlim,@Adatptr
  878.     blo    @_10
  879. ;
  880.     move.l    @Arngred,preconv_bass_rngred
  881.     move.l    @Arngwrt,preconv_bass_rngwrt
  882.     move.l    @Dleft,preconv_bass_left
  883.     move.l    @Dright,preconv_bass_right
  884. ;
  885.   .endif
  886. ;
  887.     movea.l    preconv_dst_top_ptr,Adst
  888.     movea.l    preconv_src_cur_ptr,Asrc
  889.     movea.l    preconv_src_lim_ptr,Alim
  890.     .endm
  891.  
  892. LOOP_PRECONV_BUFFER    .macro    side
  893.     .endm
  894.  
  895. ;ステレオ→ステレオ,16bit,little-endian
  896. GET_DATA_1    .macro    src,dat,tmp
  897.     move.w    (src)+,dat
  898.     addq.l    #2,src
  899.     .endm
  900.  
  901. GET_DATA_2    .macro    src,dat,tmp
  902.     addq.l    #2,src
  903.     move.w    (src)+,dat
  904.     .endm
  905.  
  906.   .irp %q,LQ,HQ,SQ
  907.     .text
  908.     .align    4,$2048
  909. preconv_bass_ss16l_stereo_%q::
  910.     .if TEST_68000
  911.     bra    preconv_bass_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  912.     .else
  913.     IS68000    d0
  914.     beq    preconv_bass_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  915.     .endif
  916.     move.l    a0,preconv_dst_top_ptr
  917.     move.l    a1,preconv_src_cur_ptr
  918.     move.l    a2,preconv_src_lim_ptr
  919.     PRECONV_STEREO_%q
  920.     movea.l    preconv_dst_top_ptr,a1
  921.     rts
  922.   .endm
  923.  
  924.  
  925. START_PRECONV_BUFFER    .macro    side
  926.  
  927. @Ddat    reg    Ddat    ;データ
  928. @Dtmp    reg    Dtmp    ;テンポラリ
  929. @Adatlim    reg    Alim    ;データの末尾
  930. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  931. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  932. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  933. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  934. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  935. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  936. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  937. @Rmin    reg    Rsrat    ;-32768
  938. @Rmax    reg    Rsone    ;32767
  939.  
  940.     movea.l    preconv_src_lim_ptr,@Adatlim
  941.     movea.l    preconv_src_cur_ptr,@Adatptr
  942.     movea.l    preconv_bass_rngred,@Arngred
  943.     movea.l    preconv_bass_rngwrt,@Arngwrt
  944.     move.l    #bass_ring_buffer,@Rrngtop
  945.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  946.     move.l    preconv_bass_left,@Dleft
  947.     move.l    #-32768,@Rmin
  948.     move.l    #32767,@Rmax
  949. @_10:
  950. ;left
  951.     move.w    (@Arngwrt),@Ddat
  952.     ext.l    @Ddat
  953.     sub.l    @Ddat,@Dleft
  954.     move.w    (@Adatptr),@Ddat
  955.     rol.w    #8,@Ddat
  956.     move.w    (2,@Adatptr),@Dtmp
  957.     rol.w    #8,@Dtmp
  958.     add.w    @Dtmp,@Ddat
  959.     bvc    @_11
  960.     roxr.w    #1,@Ddat
  961.     bra    @_12
  962. @_11:
  963.     asr.w    #1,@Ddat
  964. @_12:
  965.     ext.l    @Ddat
  966.     add.l    @Ddat,@Dleft
  967.     move.w    @Ddat,(@Arngwrt)+
  968.     move.w    (@Arngred)+,@Ddat
  969.     ext.l    @Ddat
  970.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  971.     add.l    @Dleft,@Ddat
  972.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  973.     cmp.l    @Rmin,@Ddat
  974.     bge    @f
  975.     move.l    @Rmin,@Ddat
  976. @@:    cmp.l    @Rmax,@Ddat
  977.     ble    @f
  978.     move.l    @Rmax,@Ddat
  979. @@:
  980.     move.w    @Ddat,(@Adatptr)+
  981. ;
  982.     addq.l    #2,@Arngred
  983.     addq.l    #2,@Arngwrt
  984.     addq.l    #2,@Adatptr
  985. ;
  986.     cmpa.l    @Rrngbtm,@Arngred
  987.     blo    @f
  988.     movea.l    @Rrngtop,@Arngred
  989. @@:
  990. ;
  991.     cmpa.l    @Rrngbtm,@Arngwrt
  992.     blo    @f
  993.     movea.l    @Rrngtop,@Arngwrt
  994. @@:
  995. ;
  996.     cmpa.l    @Adatlim,@Adatptr
  997.     blo    @_10
  998. ;
  999.     move.l    @Arngred,preconv_bass_rngred
  1000.     move.l    @Arngwrt,preconv_bass_rngwrt
  1001.     move.l    @Dleft,preconv_bass_left
  1002. ;
  1003.     movea.l    preconv_dst_top_ptr,Adst
  1004.     movea.l    preconv_src_cur_ptr,Asrc
  1005.     movea.l    preconv_src_lim_ptr,Alim
  1006.     .endm
  1007.  
  1008. LOOP_PRECONV_BUFFER    .macro    side
  1009.     .endm
  1010.  
  1011. ;ステレオ→モノラル,16bit,little-endian
  1012. GET_DATA_0    .macro    src,dat,tmp
  1013.     move.w    (src)+,dat
  1014.     addq.l    #2,src
  1015.     .endm
  1016.  
  1017.   .irp %q,LQ,HQ,SQ
  1018.     .text
  1019.     .align    4,$2048
  1020. preconv_bass_ss16l_mono_%q::
  1021.     .if TEST_68000
  1022.     bra    preconv_bass_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  1023.     .else
  1024.     IS68000    d0
  1025.     beq    preconv_bass_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  1026.     .endif
  1027.     move.l    a0,preconv_dst_top_ptr
  1028.     move.l    a1,preconv_src_cur_ptr
  1029.     move.l    a2,preconv_src_lim_ptr
  1030.     PRECONV_MONO_%q
  1031.     movea.l    preconv_dst_top_ptr,a1
  1032.     rts
  1033.   .endm
  1034.  
  1035.  
  1036. START_PRECONV_BUFFER    .macro    side
  1037.  
  1038. @Ddat    reg    Ddat    ;データ
  1039. @Dtmp    reg    Dtmp    ;テンポラリ
  1040. @Adatlim    reg    Alim    ;データの末尾
  1041. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1042. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1043. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1044. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1045. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1046. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1047. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1048. @Rmin    reg    Rsrat    ;-32768
  1049. @Rmax    reg    Rsone    ;32767
  1050.  
  1051.     movea.l    preconv_src_lim_ptr,@Adatlim
  1052.     movea.l    preconv_src_cur_ptr,@Adatptr
  1053.     movea.l    preconv_bass_rngred,@Arngred
  1054.     movea.l    preconv_bass_rngwrt,@Arngwrt
  1055.     move.l    #bass_ring_buffer,@Rrngtop
  1056.     move.l    #bass_ring_buffer+BASS_RING_SIZE,@Rrngbtm
  1057.     move.l    preconv_bass_left,@Dleft
  1058.     move.l    #-32768,@Rmin
  1059.     move.l    #32767,@Rmax
  1060. @_10:
  1061. ;left
  1062.     move.w    (@Arngwrt),@Ddat
  1063.     ext.l    @Ddat
  1064.     sub.l    @Ddat,@Dleft
  1065.     move.w    (@Adatptr),@Ddat
  1066.     rol.w    #8,@Ddat
  1067.     ext.l    @Ddat
  1068.     add.l    @Ddat,@Dleft
  1069.     move.w    @Ddat,(@Arngwrt)+
  1070.     move.w    (@Arngred)+,@Ddat
  1071.     ext.l    @Ddat
  1072.     asl.l    #BASS_INPUT_SHIFT_LEFT,@Ddat
  1073.     add.l    @Dleft,@Ddat
  1074.     asr.l    #BASS_OUTPUT_SHIFT_RIGHT,@Ddat
  1075.     cmp.l    @Rmin,@Ddat
  1076.     bge    @f
  1077.     move.l    @Rmin,@Ddat
  1078. @@:    cmp.l    @Rmax,@Ddat
  1079.     ble    @f
  1080.     move.l    @Rmax,@Ddat
  1081. @@:
  1082.     move.w    @Ddat,(@Adatptr)+
  1083. ;
  1084.     addq.l    #2,@Arngred
  1085.     addq.l    #2,@Arngwrt
  1086.     addq.l    #2,@Adatptr
  1087. ;
  1088.     cmpa.l    @Rrngbtm,@Arngred
  1089.     blo    @f
  1090.     movea.l    @Rrngtop,@Arngred
  1091. @@:
  1092. ;
  1093.     cmpa.l    @Rrngbtm,@Arngwrt
  1094.     blo    @f
  1095.     movea.l    @Rrngtop,@Arngwrt
  1096. @@:
  1097. ;
  1098.     cmpa.l    @Adatlim,@Adatptr
  1099.     blo    @_10
  1100. ;
  1101.     move.l    @Arngred,preconv_bass_rngred
  1102.     move.l    @Arngwrt,preconv_bass_rngwrt
  1103.     move.l    @Dleft,preconv_bass_left
  1104. ;
  1105.     movea.l    preconv_dst_top_ptr,Adst
  1106.     movea.l    preconv_src_cur_ptr,Asrc
  1107.     movea.l    preconv_src_lim_ptr,Alim
  1108.     .endm
  1109.  
  1110. LOOP_PRECONV_BUFFER    .macro    side
  1111.     .endm
  1112.  
  1113. ;モノラル→モノラル,16bit,little-endian
  1114. GET_DATA_0    .macro    src,dat,tmp
  1115.     move.w    (src)+,dat
  1116.     .endm
  1117.  
  1118.   .irp %q,LQ,HQ,SQ
  1119.     .text
  1120.     .align    4,$2048
  1121. preconv_bass_ms16l_mono_%q::
  1122.     .if TEST_68000
  1123.     bra    preconv_bass_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  1124.     .else
  1125.     IS68000    d0
  1126.     beq    preconv_bass_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  1127.     .endif
  1128.     move.l    a0,preconv_dst_top_ptr
  1129.     move.l    a1,preconv_src_cur_ptr
  1130.     move.l    a2,preconv_src_lim_ptr
  1131.     PRECONV_MONO_%q
  1132.     movea.l    preconv_dst_top_ptr,a1
  1133.     rts
  1134.   .endm
  1135.  
  1136.     .bss
  1137.     .align    4
  1138. preconv_bass_rngred:    .ds.l    1    ;bass_ring_buffer
  1139. preconv_bass_rngwrt:    .ds.l    1    ;bass_ring_buffer+BASS_RING_SIZE/2
  1140. preconv_bass_left:    .ds.l    1    ;0
  1141. preconv_bass_right:    .ds.l    1    ;0
  1142.     .align    4
  1143. bass_ring_buffer:    .ds.b    BASS_RING_SIZE    ;0
  1144.  
  1145.  
  1146. ;----------------------------------------------------------------
  1147. ;ハイカットフィルタ
  1148.  
  1149. START_PRECONV_BUFFER    .macro    side
  1150.  
  1151.   .if side<2
  1152.  
  1153. @Ddat    reg    Ddat    ;データ
  1154. @Dtmp    reg    Dtmp    ;テンポラリ
  1155. @Adatlim    reg    Alim    ;データの末尾
  1156. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1157. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1158. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1159. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1160. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1161. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1162. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1163. @Rmin    reg    Rsrat    ;-32768
  1164. @Rmax    reg    Rsone    ;32767
  1165.  
  1166.     movea.l    preconv_src_lim_ptr,@Adatlim
  1167.     movea.l    preconv_src_cur_ptr,@Adatptr
  1168.     movea.l    preconv_hicut_rngred,@Arngred
  1169.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1170.     move.l    #hicut_ring_buffer,@Rrngtop
  1171.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1172.     move.l    preconv_hicut_left,@Dleft
  1173.     move.l    preconv_hicut_right,@Dright
  1174.     move.l    #-32768,@Rmin
  1175.     move.l    #32767,@Rmax
  1176. @_10:
  1177. ;left
  1178.     move.w    (@Arngwrt),@Ddat
  1179.     ext.l    @Ddat
  1180.     sub.l    @Ddat,@Dleft
  1181.     move.w    (@Adatptr),@Ddat
  1182.     ext.l    @Ddat
  1183.     add.l    @Ddat,@Dleft
  1184.     move.w    @Ddat,(@Arngwrt)+
  1185.     addq.l    #2,@Arngred
  1186.     move.l    @Dleft,@Ddat
  1187.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1188.     cmp.l    @Rmin,@Ddat
  1189.     bge    @f
  1190.     move.l    @Rmin,@Ddat
  1191. @@:    cmp.l    @Rmax,@Ddat
  1192.     ble    @f
  1193.     move.l    @Rmax,@Ddat
  1194. @@:
  1195.     move.w    @Ddat,(@Adatptr)+
  1196. ;right
  1197.     move.w    (@Arngwrt),@Ddat
  1198.     ext.l    @Ddat
  1199.     sub.l    @Ddat,@Dright
  1200.     move.w    (@Adatptr),@Ddat
  1201.     ext.l    @Ddat
  1202.     add.l    @Ddat,@Dright
  1203.     move.w    @Ddat,(@Arngwrt)+
  1204.     addq.l    #2,@Arngred
  1205.     move.l    @Dright,@Ddat
  1206.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1207.     cmp.l    @Rmin,@Ddat
  1208.     bge    @f
  1209.     move.l    @Rmin,@Ddat
  1210. @@:    cmp.l    @Rmax,@Ddat
  1211.     ble    @f
  1212.     move.l    @Rmax,@Ddat
  1213. @@:
  1214.     move.w    @Ddat,(@Adatptr)+
  1215. ;
  1216.     cmpa.l    @Rrngbtm,@Arngred
  1217.     blo    @f
  1218.     movea.l    @Rrngtop,@Arngred
  1219. @@:
  1220. ;
  1221.     cmpa.l    @Rrngbtm,@Arngwrt
  1222.     blo    @f
  1223.     movea.l    @Rrngtop,@Arngwrt
  1224. @@:
  1225. ;
  1226.     cmpa.l    @Adatlim,@Adatptr
  1227.     blo    @_10
  1228. ;
  1229.     move.l    @Arngred,preconv_hicut_rngred
  1230.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1231.     move.l    @Dleft,preconv_hicut_left
  1232.     move.l    @Dright,preconv_hicut_right
  1233. ;
  1234.   .endif
  1235. ;
  1236.     movea.l    preconv_dst_top_ptr,Adst
  1237.     movea.l    preconv_src_cur_ptr,Asrc
  1238.     movea.l    preconv_src_lim_ptr,Alim
  1239.     .endm
  1240.  
  1241. LOOP_PRECONV_BUFFER    .macro    side
  1242.     .endm
  1243.  
  1244. ;ステレオ→ステレオ,16bit,big-endian
  1245. GET_DATA_1    .macro    src,dat,tmp
  1246.     move.w    (src)+,dat
  1247.     addq.l    #2,src
  1248.     .endm
  1249.  
  1250. GET_DATA_2    .macro    src,dat,tmp
  1251.     addq.l    #2,src
  1252.     move.w    (src)+,dat
  1253.     .endm
  1254.  
  1255.   .irp %q,LQ,HQ,SQ
  1256.     .text
  1257.     .align    4,$2048
  1258. preconv_hicut_ss16b_stereo_%q::
  1259.     move.l    a0,preconv_dst_top_ptr
  1260.     move.l    a1,preconv_src_cur_ptr
  1261.     move.l    a2,preconv_src_lim_ptr
  1262.     PRECONV_STEREO_%q
  1263.     movea.l    preconv_dst_top_ptr,a1
  1264.     rts
  1265.   .endm
  1266.  
  1267.  
  1268. START_PRECONV_BUFFER    .macro    side
  1269.  
  1270. @Ddat    reg    Ddat    ;データ
  1271. @Dtmp    reg    Dtmp    ;テンポラリ
  1272. @Adatlim    reg    Alim    ;データの末尾
  1273. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1274. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1275. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1276. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1277. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1278. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1279. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1280. @Rmin    reg    Rsrat    ;-32768
  1281. @Rmax    reg    Rsone    ;32767
  1282.  
  1283.     movea.l    preconv_src_lim_ptr,@Adatlim
  1284.     movea.l    preconv_src_cur_ptr,@Adatptr
  1285.     movea.l    preconv_hicut_rngred,@Arngred
  1286.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1287.     move.l    #hicut_ring_buffer,@Rrngtop
  1288.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1289.     move.l    preconv_hicut_left,@Dleft
  1290.     move.l    #-32768,@Rmin
  1291.     move.l    #32767,@Rmax
  1292. @_10:
  1293. ;left
  1294.     move.w    (@Arngwrt),@Ddat
  1295.     ext.l    @Ddat
  1296.     sub.l    @Ddat,@Dleft
  1297.     move.w    (@Adatptr),@Ddat
  1298.     add.w    (2,@Adatptr),@Ddat
  1299.     bvc    @_11
  1300.     roxr.w    #1,@Ddat
  1301.     bra    @_12
  1302. @_11:
  1303.     asr.w    #1,@Ddat
  1304. @_12:
  1305.     ext.l    @Ddat
  1306.     add.l    @Ddat,@Dleft
  1307.     move.w    @Ddat,(@Arngwrt)+
  1308.     addq.l    #2,@Arngred
  1309.     move.l    @Dleft,@Ddat
  1310.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1311.     cmp.l    @Rmin,@Ddat
  1312.     bge    @f
  1313.     move.l    @Rmin,@Ddat
  1314. @@:    cmp.l    @Rmax,@Ddat
  1315.     ble    @f
  1316.     move.l    @Rmax,@Ddat
  1317. @@:
  1318.     move.w    @Ddat,(@Adatptr)+
  1319. ;
  1320.     addq.l    #2,@Arngred
  1321.     addq.l    #2,@Arngwrt
  1322.     addq.l    #2,@Adatptr
  1323. ;
  1324.     cmpa.l    @Rrngbtm,@Arngred
  1325.     blo    @f
  1326.     movea.l    @Rrngtop,@Arngred
  1327. @@:
  1328. ;
  1329.     cmpa.l    @Rrngbtm,@Arngwrt
  1330.     blo    @f
  1331.     movea.l    @Rrngtop,@Arngwrt
  1332. @@:
  1333. ;
  1334.     cmpa.l    @Adatlim,@Adatptr
  1335.     blo    @_10
  1336. ;
  1337.     move.l    @Arngred,preconv_hicut_rngred
  1338.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1339.     move.l    @Dleft,preconv_hicut_left
  1340. ;
  1341.     movea.l    preconv_dst_top_ptr,Adst
  1342.     movea.l    preconv_src_cur_ptr,Asrc
  1343.     movea.l    preconv_src_lim_ptr,Alim
  1344.     .endm
  1345.  
  1346. LOOP_PRECONV_BUFFER    .macro    side
  1347.     .endm
  1348.  
  1349. ;ステレオ→モノラル,16bit,big-endian
  1350. GET_DATA_0    .macro    src,dat,tmp
  1351.     move.w    (src)+,dat
  1352.     addq.l    #2,src
  1353.     .endm
  1354.  
  1355.   .irp %q,LQ,HQ,SQ
  1356.     .text
  1357.     .align    4,$2048
  1358. preconv_hicut_ss16b_mono_%q::
  1359.     move.l    a0,preconv_dst_top_ptr
  1360.     move.l    a1,preconv_src_cur_ptr
  1361.     move.l    a2,preconv_src_lim_ptr
  1362.     PRECONV_MONO_%q
  1363.     movea.l    preconv_dst_top_ptr,a1
  1364.     rts
  1365.   .endm
  1366.  
  1367.  
  1368. START_PRECONV_BUFFER    .macro    side
  1369.  
  1370. @Ddat    reg    Ddat    ;データ
  1371. @Dtmp    reg    Dtmp    ;テンポラリ
  1372. @Adatlim    reg    Alim    ;データの末尾
  1373. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1374. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1375. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1376. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1377. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1378. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1379. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1380. @Rmin    reg    Rsrat    ;-32768
  1381. @Rmax    reg    Rsone    ;32767
  1382.  
  1383.     movea.l    preconv_src_lim_ptr,@Adatlim
  1384.     movea.l    preconv_src_cur_ptr,@Adatptr
  1385.     movea.l    preconv_hicut_rngred,@Arngred
  1386.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1387.     move.l    #hicut_ring_buffer,@Rrngtop
  1388.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1389.     move.l    preconv_hicut_left,@Dleft
  1390.     move.l    #-32768,@Rmin
  1391.     move.l    #32767,@Rmax
  1392. @_10:
  1393. ;left
  1394.     move.w    (@Arngwrt),@Ddat
  1395.     ext.l    @Ddat
  1396.     sub.l    @Ddat,@Dleft
  1397.     move.w    (@Adatptr),@Ddat
  1398.     ext.l    @Ddat
  1399.     add.l    @Ddat,@Dleft
  1400.     move.w    @Ddat,(@Arngwrt)+
  1401.     addq.l    #2,@Arngred
  1402.     move.l    @Dleft,@Ddat
  1403.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1404.     cmp.l    @Rmin,@Ddat
  1405.     bge    @f
  1406.     move.l    @Rmin,@Ddat
  1407. @@:    cmp.l    @Rmax,@Ddat
  1408.     ble    @f
  1409.     move.l    @Rmax,@Ddat
  1410. @@:
  1411.     move.w    @Ddat,(@Adatptr)+
  1412. ;
  1413.     addq.l    #2,@Arngred
  1414.     addq.l    #2,@Arngwrt
  1415.     addq.l    #2,@Adatptr
  1416. ;
  1417.     cmpa.l    @Rrngbtm,@Arngred
  1418.     blo    @f
  1419.     movea.l    @Rrngtop,@Arngred
  1420. @@:
  1421. ;
  1422.     cmpa.l    @Rrngbtm,@Arngwrt
  1423.     blo    @f
  1424.     movea.l    @Rrngtop,@Arngwrt
  1425. @@:
  1426. ;
  1427.     cmpa.l    @Adatlim,@Adatptr
  1428.     blo    @_10
  1429. ;
  1430.     move.l    @Arngred,preconv_hicut_rngred
  1431.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1432.     move.l    @Dleft,preconv_hicut_left
  1433. ;
  1434.     movea.l    preconv_dst_top_ptr,Adst
  1435.     movea.l    preconv_src_cur_ptr,Asrc
  1436.     movea.l    preconv_src_lim_ptr,Alim
  1437.     .endm
  1438.  
  1439. LOOP_PRECONV_BUFFER    .macro    side
  1440.     .endm
  1441.  
  1442. ;モノラル→モノラル,16bit,big-endian
  1443. GET_DATA_0    .macro    src,dat,tmp
  1444.     move.w    (src)+,dat        ;常にvc
  1445.     .endm
  1446.  
  1447.   .irp %q,LQ,HQ,SQ
  1448.     .text
  1449.     .align    4,$2048
  1450. preconv_hicut_ms16b_mono_%q::
  1451.     move.l    a0,preconv_dst_top_ptr
  1452.     move.l    a1,preconv_src_cur_ptr
  1453.     move.l    a2,preconv_src_lim_ptr
  1454.     PRECONV_MONO_%q
  1455.     movea.l    preconv_dst_top_ptr,a1
  1456.     rts
  1457.   .endm
  1458.  
  1459.  
  1460. START_PRECONV_BUFFER    .macro    side
  1461.  
  1462.   .if side<2
  1463.  
  1464. @Ddat    reg    Ddat    ;データ
  1465. @Dtmp    reg    Dtmp    ;テンポラリ
  1466. @Adatlim    reg    Alim    ;データの末尾
  1467. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1468. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1469. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1470. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1471. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1472. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1473. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1474. @Rmin    reg    Rsrat    ;-32768
  1475. @Rmax    reg    Rsone    ;32767
  1476.  
  1477.     movea.l    preconv_src_lim_ptr,@Adatlim
  1478.     movea.l    preconv_src_cur_ptr,@Adatptr
  1479.     movea.l    preconv_hicut_rngred,@Arngred
  1480.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1481.     move.l    #hicut_ring_buffer,@Rrngtop
  1482.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1483.     move.l    preconv_hicut_left,@Dleft
  1484.     move.l    preconv_hicut_right,@Dright
  1485.     move.l    #-32768,@Rmin
  1486.     move.l    #32767,@Rmax
  1487. @_10:
  1488. ;left
  1489.     move.w    (@Arngwrt),@Ddat
  1490.     ext.l    @Ddat
  1491.     sub.l    @Ddat,@Dleft
  1492.     move.w    (@Adatptr),@Ddat
  1493.     rol.w    #8,@Ddat
  1494.     ext.l    @Ddat
  1495.     add.l    @Ddat,@Dleft
  1496.     move.w    @Ddat,(@Arngwrt)+
  1497.     addq.l    #2,@Arngred
  1498.     move.l    @Dleft,@Ddat
  1499.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1500.     cmp.l    @Rmin,@Ddat
  1501.     bge    @f
  1502.     move.l    @Rmin,@Ddat
  1503. @@:    cmp.l    @Rmax,@Ddat
  1504.     ble    @f
  1505.     move.l    @Rmax,@Ddat
  1506. @@:
  1507.     move.w    @Ddat,(@Adatptr)+
  1508. ;right
  1509.     move.w    (@Arngwrt),@Ddat
  1510.     ext.l    @Ddat
  1511.     sub.l    @Ddat,@Dright
  1512.     move.w    (@Adatptr),@Ddat
  1513.     rol.w    #8,@Ddat
  1514.     ext.l    @Ddat
  1515.     add.l    @Ddat,@Dright
  1516.     move.w    @Ddat,(@Arngwrt)+
  1517.     addq.l    #2,@Arngred
  1518.     move.l    @Dright,@Ddat
  1519.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1520.     cmp.l    @Rmin,@Ddat
  1521.     bge    @f
  1522.     move.l    @Rmin,@Ddat
  1523. @@:    cmp.l    @Rmax,@Ddat
  1524.     ble    @f
  1525.     move.l    @Rmax,@Ddat
  1526. @@:
  1527.     move.w    @Ddat,(@Adatptr)+
  1528. ;
  1529.     cmpa.l    @Rrngbtm,@Arngred
  1530.     blo    @f
  1531.     movea.l    @Rrngtop,@Arngred
  1532. @@:
  1533. ;
  1534.     cmpa.l    @Rrngbtm,@Arngwrt
  1535.     blo    @f
  1536.     movea.l    @Rrngtop,@Arngwrt
  1537. @@:
  1538. ;
  1539.     cmpa.l    @Adatlim,@Adatptr
  1540.     blo    @_10
  1541. ;
  1542.     move.l    @Arngred,preconv_hicut_rngred
  1543.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1544.     move.l    @Dleft,preconv_hicut_left
  1545.     move.l    @Dright,preconv_hicut_right
  1546. ;
  1547.   .endif
  1548. ;
  1549.     movea.l    preconv_dst_top_ptr,Adst
  1550.     movea.l    preconv_src_cur_ptr,Asrc
  1551.     movea.l    preconv_src_lim_ptr,Alim
  1552.     .endm
  1553.  
  1554. LOOP_PRECONV_BUFFER    .macro    side
  1555.     .endm
  1556.  
  1557. ;ステレオ→ステレオ,16bit,little-endian
  1558. GET_DATA_1    .macro    src,dat,tmp
  1559.     move.w    (src)+,dat
  1560.     addq.l    #2,src
  1561.     .endm
  1562.  
  1563. GET_DATA_2    .macro    src,dat,tmp
  1564.     addq.l    #2,src
  1565.     move.w    (src)+,dat
  1566.     .endm
  1567.  
  1568.   .irp %q,LQ,HQ,SQ
  1569.     .text
  1570.     .align    4,$2048
  1571. preconv_hicut_ss16l_stereo_%q::
  1572.     .if TEST_68000
  1573.     bra    preconv_hicut_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  1574.     .else
  1575.     IS68000    d0
  1576.     beq    preconv_hicut_ss16b_stereo_%q    ;68000のときはエンディアン変換済み
  1577.     .endif
  1578.     move.l    a0,preconv_dst_top_ptr
  1579.     move.l    a1,preconv_src_cur_ptr
  1580.     move.l    a2,preconv_src_lim_ptr
  1581.     PRECONV_STEREO_%q
  1582.     movea.l    preconv_dst_top_ptr,a1
  1583.     rts
  1584.   .endm
  1585.  
  1586.  
  1587. START_PRECONV_BUFFER    .macro    side
  1588.  
  1589. @Ddat    reg    Ddat    ;データ
  1590. @Dtmp    reg    Dtmp    ;テンポラリ
  1591. @Adatlim    reg    Alim    ;データの末尾
  1592. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1593. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1594. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1595. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1596. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1597. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1598. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1599. @Rmin    reg    Rsrat    ;-32768
  1600. @Rmax    reg    Rsone    ;32767
  1601.  
  1602.     movea.l    preconv_src_lim_ptr,@Adatlim
  1603.     movea.l    preconv_src_cur_ptr,@Adatptr
  1604.     movea.l    preconv_hicut_rngred,@Arngred
  1605.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1606.     move.l    #hicut_ring_buffer,@Rrngtop
  1607.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1608.     move.l    preconv_hicut_left,@Dleft
  1609.     move.l    #-32768,@Rmin
  1610.     move.l    #32767,@Rmax
  1611. @_10:
  1612. ;left
  1613.     move.w    (@Arngwrt),@Ddat
  1614.     ext.l    @Ddat
  1615.     sub.l    @Ddat,@Dleft
  1616.     move.w    (@Adatptr),@Ddat
  1617.     rol.w    #8,@Ddat
  1618.     move.w    (2,@Adatptr),@Dtmp
  1619.     rol.w    #8,@Dtmp
  1620.     add.w    @Dtmp,@Ddat
  1621.     bvc    @_11
  1622.     roxr.w    #1,@Ddat
  1623.     bra    @_12
  1624. @_11:
  1625.     asr.w    #1,@Ddat
  1626. @_12:
  1627.     ext.l    @Ddat
  1628.     add.l    @Ddat,@Dleft
  1629.     move.w    @Ddat,(@Arngwrt)+
  1630.     addq.l    #2,@Arngred
  1631.     move.l    @Dleft,@Ddat
  1632.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1633.     cmp.l    @Rmin,@Ddat
  1634.     bge    @f
  1635.     move.l    @Rmin,@Ddat
  1636. @@:    cmp.l    @Rmax,@Ddat
  1637.     ble    @f
  1638.     move.l    @Rmax,@Ddat
  1639. @@:
  1640.     move.w    @Ddat,(@Adatptr)+
  1641. ;
  1642.     addq.l    #2,@Arngred
  1643.     addq.l    #2,@Arngwrt
  1644.     addq.l    #2,@Adatptr
  1645. ;
  1646.     cmpa.l    @Rrngbtm,@Arngred
  1647.     blo    @f
  1648.     movea.l    @Rrngtop,@Arngred
  1649. @@:
  1650. ;
  1651.     cmpa.l    @Rrngbtm,@Arngwrt
  1652.     blo    @f
  1653.     movea.l    @Rrngtop,@Arngwrt
  1654. @@:
  1655. ;
  1656.     cmpa.l    @Adatlim,@Adatptr
  1657.     blo    @_10
  1658. ;
  1659.     move.l    @Arngred,preconv_hicut_rngred
  1660.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1661.     move.l    @Dleft,preconv_hicut_left
  1662. ;
  1663.     movea.l    preconv_dst_top_ptr,Adst
  1664.     movea.l    preconv_src_cur_ptr,Asrc
  1665.     movea.l    preconv_src_lim_ptr,Alim
  1666.     .endm
  1667.  
  1668. LOOP_PRECONV_BUFFER    .macro    side
  1669.     .endm
  1670.  
  1671. ;ステレオ→モノラル,16bit,little-endian
  1672. GET_DATA_0    .macro    src,dat,tmp
  1673.     move.w    (src)+,dat
  1674.     addq.l    #2,src
  1675.     .endm
  1676.  
  1677.   .irp %q,LQ,HQ,SQ
  1678.     .text
  1679.     .align    4,$2048
  1680. preconv_hicut_ss16l_mono_%q::
  1681.     .if TEST_68000
  1682.     bra    preconv_hicut_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  1683.     .else
  1684.     IS68000    d0
  1685.     beq    preconv_hicut_ss16b_mono_%q    ;68000のときはエンディアン変換済み
  1686.     .endif
  1687.     move.l    a0,preconv_dst_top_ptr
  1688.     move.l    a1,preconv_src_cur_ptr
  1689.     move.l    a2,preconv_src_lim_ptr
  1690.     PRECONV_MONO_%q
  1691.     movea.l    preconv_dst_top_ptr,a1
  1692.     rts
  1693.   .endm
  1694.  
  1695.  
  1696. START_PRECONV_BUFFER    .macro    side
  1697.  
  1698. @Ddat    reg    Ddat    ;データ
  1699. @Dtmp    reg    Dtmp    ;テンポラリ
  1700. @Adatlim    reg    Alim    ;データの末尾
  1701. @Adatptr    reg    Asrc    ;バッファ上で次に使用するデータの位置
  1702. @Arngred    reg    Ajmp    ;リングバッファ上で次に使用するデータの位置
  1703. @Arngwrt    reg    Adst    ;リングバッファの書き込みポインタ
  1704. @Rrngtop    reg    Rpre    ;リングバッファの先頭
  1705. @Rrngbtm    reg    Rbak    ;リングバッファの末尾
  1706. @Dleft    reg    Dscnt    ;リングバッファ上のleftのデータの和
  1707. @Dright    reg    Dtop    ;リングバッファ上のrightのデータの和
  1708. @Rmin    reg    Rsrat    ;-32768
  1709. @Rmax    reg    Rsone    ;32767
  1710.  
  1711.     movea.l    preconv_src_lim_ptr,@Adatlim
  1712.     movea.l    preconv_src_cur_ptr,@Adatptr
  1713.     movea.l    preconv_hicut_rngred,@Arngred
  1714.     movea.l    preconv_hicut_rngwrt,@Arngwrt
  1715.     move.l    #hicut_ring_buffer,@Rrngtop
  1716.     move.l    #hicut_ring_buffer+HICUT_RING_SIZE,@Rrngbtm
  1717.     move.l    preconv_hicut_left,@Dleft
  1718.     move.l    #-32768,@Rmin
  1719.     move.l    #32767,@Rmax
  1720. @_10:
  1721. ;left
  1722.     move.w    (@Arngwrt),@Ddat
  1723.     ext.l    @Ddat
  1724.     sub.l    @Ddat,@Dleft
  1725.     move.w    (@Adatptr),@Ddat
  1726.     rol.w    #8,@Ddat
  1727.     ext.l    @Ddat
  1728.     add.l    @Ddat,@Dleft
  1729.     move.w    @Ddat,(@Arngwrt)+
  1730.     addq.l    #2,@Arngred
  1731.     move.l    @Dleft,@Ddat
  1732.     asr.l    #HICUT_OUTPUT_SHIFT_RIGHT,@Ddat
  1733.     cmp.l    @Rmin,@Ddat
  1734.     bge    @f
  1735.     move.l    @Rmin,@Ddat
  1736. @@:    cmp.l    @Rmax,@Ddat
  1737.     ble    @f
  1738.     move.l    @Rmax,@Ddat
  1739. @@:
  1740.     move.w    @Ddat,(@Adatptr)+
  1741. ;
  1742.     addq.l    #2,@Arngred
  1743.     addq.l    #2,@Arngwrt
  1744.     addq.l    #2,@Adatptr
  1745. ;
  1746.     cmpa.l    @Rrngbtm,@Arngred
  1747.     blo    @f
  1748.     movea.l    @Rrngtop,@Arngred
  1749. @@:
  1750. ;
  1751.     cmpa.l    @Rrngbtm,@Arngwrt
  1752.     blo    @f
  1753.     movea.l    @Rrngtop,@Arngwrt
  1754. @@:
  1755. ;
  1756.     cmpa.l    @Adatlim,@Adatptr
  1757.     blo    @_10
  1758. ;
  1759.     move.l    @Arngred,preconv_hicut_rngred
  1760.     move.l    @Arngwrt,preconv_hicut_rngwrt
  1761.     move.l    @Dleft,preconv_hicut_left
  1762. ;
  1763.     movea.l    preconv_dst_top_ptr,Adst
  1764.     movea.l    preconv_src_cur_ptr,Asrc
  1765.     movea.l    preconv_src_lim_ptr,Alim
  1766.     .endm
  1767.  
  1768. LOOP_PRECONV_BUFFER    .macro    side
  1769.     .endm
  1770.  
  1771. ;モノラル→モノラル,16bit,little-endian
  1772. GET_DATA_0    .macro    src,dat,tmp
  1773.     move.w    (src)+,dat
  1774.     .endm
  1775.  
  1776.   .irp %q,LQ,HQ,SQ
  1777.     .text
  1778.     .align    4,$2048
  1779. preconv_hicut_ms16l_mono_%q::
  1780.     .if TEST_68000
  1781.     bra    preconv_hicut_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  1782.     .else
  1783.     IS68000    d0
  1784.     beq    preconv_hicut_ms16b_mono_%q    ;68000のときはエンディアン変換済み
  1785.     .endif
  1786.     move.l    a0,preconv_dst_top_ptr
  1787.     move.l    a1,preconv_src_cur_ptr
  1788.     move.l    a2,preconv_src_lim_ptr
  1789.     PRECONV_MONO_%q
  1790.     movea.l    preconv_dst_top_ptr,a1
  1791.     rts
  1792.   .endm
  1793.  
  1794.     .bss
  1795.     .align    4
  1796. preconv_hicut_rngred:    .ds.l    1    ;hicut_ring_buffer
  1797. preconv_hicut_rngwrt:    .ds.l    1    ;hicut_ring_buffer+HICUT_RING_SIZE/2
  1798. preconv_hicut_left:    .ds.l    1    ;0
  1799. preconv_hicut_right:    .ds.l    1    ;0
  1800.     .align    4
  1801. hicut_ring_buffer:    .ds.b    HICUT_RING_SIZE    ;0
  1802.  
  1803.  
  1804. ;----------------------------------------------------------------
  1805. ;----------------------------------------------------------------
  1806. ;PCM→OPM変換テーブルを作る
  1807. ;    L=10^(-0.75/20*TL)
  1808.     .text
  1809.     .align    4,$2048
  1810. make_table::
  1811.     movem.l    d1-d7/a0-a3,-(sp)
  1812.  
  1813.   .if 0
  1814.     lea.l    (m_make_table,pc),a0
  1815.     bsr    silent_eprint
  1816.   .endif
  1817.  
  1818.     lea.l    (half_tl_table,pc),a2    ;126.5~0.5
  1819.     lea.l    pcm2tl_table+32768,a0    ;a0は0~32767
  1820.     lea.l    (1,a0),a1        ;a1は0~-32768だが,-(a1)で書き込むので初期値は1
  1821.     move.l    volume,d0
  1822.     FPACK    __LTOF
  1823.     move.l    d0,d1
  1824.     move.l    #$41800000,d0        ;16.0
  1825.     FPACK    __FDIV
  1826.     move.l    d0,d7            ;VOL
  1827.     move.w    #32768-1,d6
  1828.     moveq.l    #127,d5
  1829.     move.l    #$3F800000,d3        ;1.0
  1830.     moveq.l    #0,d2            ;0.0~32767.0
  1831.     bra    2f
  1832.  
  1833. 1:    subq.b    #1,d5            ;番兵があるので必ず止まる
  1834. 2:    move.l    (a2)+,d0
  1835.     move.l    d7,d1
  1836.     FPACK    __FMUL
  1837.     move.l    d0,d4
  1838. 3:    cmp.l    d4,d2            ;.sだが正の数なのでcmp.lで比較できる
  1839.     bhs    1b
  1840. 4:    move.b    d5,(a0)+        ;0~32767
  1841.     move.b    d5,-(a1)        ;0~-32767
  1842.     move.l    d2,d0
  1843.     move.l    d3,d1
  1844.     FPACK    __FADD
  1845.     move.l    d0,d2
  1846.     dbra    d6,3b
  1847.                     ;0~32767と0~-32767が完成,-32768が残っている
  1848.     cmp.l    d4,d0
  1849.     blo    5f
  1850.     tst.b    d5
  1851.     beq    5f
  1852.     subq.b    #1,d5
  1853. 5:    move.b    d5,-(a1)
  1854.  
  1855.   .if 0
  1856.     bsr    silent_ecrlf
  1857.   .endif
  1858.     movem.l    (sp)+,d1-d7/a0-a3
  1859.     rts
  1860.  
  1861. m_make_table:    .dc.b    'PCM → OPM 変換テーブルを作っています',0
  1862.     .even
  1863.  
  1864. ;(L(TL)-L(127))*32768のテーブル
  1865. ;    L(TL):=10^(-0.75/20*TL)
  1866.     .align    4,$2048
  1867. half_tl_table:
  1868.     .dc.s    0.0249790331564598439725118169021/VOL    ;TL=126.5
  1869.     .dc.s    0.0782918709331476020763667840649/VOL    ;TL=125.5
  1870.     .dc.s    0.136412699922336602786363931527/VOL    ;TL=124.5
  1871.     .dc.s    0.199775126370918425052560396896/VOL    ;TL=123.5
  1872.     .dc.s    0.268851861085055585204731577729/VOL    ;TL=122.5
  1873.     .dc.s    0.344158246055009330577173283454/VOL    ;TL=121.5
  1874.     .dc.s    0.426256099126837360489754730109/VOL    ;TL=120.5
  1875.     .dc.s    0.515757905403856993662565002971/VOL    ;TL=119.5
  1876.     .dc.s    0.613331386647521673665138088852/VOL    ;TL=118.5
  1877.     .dc.s    0.719704482767396026166953362516/VOL    ;TL=117.5
  1878.     .dc.s    0.835670782564275638328249586056/VOL    ;TL=116.5
  1879.     .dc.s    0.962095444242118369519663701653/VOL    ;TL=115.5
  1880.     .dc.s    1.09992164985833884739083589277/VOL    ;TL=114.5
  1881.     .dc.s    1.25017764186542639810460404596/VOL    ;TL=113.5
  1882.     .dc.s    1.41398439423949693643416771827/VOL    ;TL=112.5
  1883.     .dc.s    1.59256397542567932912798377748/VOL    ;TL=111.5
  1884.     .dc.s    1.78724866549148627199992039775/VOL    ;TL=110.5
  1885.     .dc.s    1.9994908955060339169251943125/VOL    ;TL=109.5
  1886.     .dc.s    2.2308740832971310441830848046/VOL    ;TL=108.5
  1887.     .dc.s    2.48312444642562093035569302004/VOL    ;TL=107.5
  1888.     .dc.s    2.7581238805068177961204790857/VOL    ;TL=106.5
  1889.     .dc.s    3.05792399895682477259486919328/VOL    ;TL=105.5
  1890.     .dc.s    3.38476143890624676944056994051/VOL    ;TL=104.5
  1891.     .dc.s    3.74107454746996202854224690479/VOL    ;TL=103.5
  1892.     .dc.s    4.12952157285966282655455833564/VOL    ;TL=102.5
  1893.     .dc.s    4.55300049605264658143806178966/VOL    ;TL=101.5
  1894.     .dc.s    5.01467065096959003491609135695/VOL    ;TL=100.5
  1895.     .dc.s    5.51797629445708127579538962277/VOL    ;TL=99.5
  1896.     .dc.s    6.06667230191706194013552490339/VOL    ;TL=98.5
  1897.     .dc.s    6.66485218028356717258122173868/VOL    ;TL=97.5
  1898.     .dc.s    7.31697860733555307749532837661/VOL    ;TL=96.5
  1899.     .dc.s    8.02791672518214930438951651899/VOL    ;TL=95.5
  1900.     .dc.s    8.80297043630397886950532805413/VOL    ;TL=94.5
  1901.     .dc.s    9.64792197293453999512298113455/VOL    ;TL=93.5
  1902.     .dc.s    10.5690750349861618635689602561/VOL    ;TL=92.5
  1903.     .dc.s    11.5733018183479152381211218609/VOL    ;TL=91.5
  1904.     .dc.s    12.6680942844066978898191874225/VOL    ;TL=90.5
  1905.     .dc.s    13.8616200532840539420906962171/VOL    ;TL=89.5
  1906.     .dc.s    15.1627833377761835296985297871/VOL    ;TL=88.5
  1907.     .dc.s    16.5812913725904012546005717612/VOL    ;TL=87.5
  1908.     .dc.s    18.1277268344685641792656189175/VOL    ;TL=86.5
  1909.     .dc.s    19.8136267934825696418567047588/VOL    ;TL=85.5
  1910.     .dc.s    21.6515687845123606900904016501/VOL    ;TL=84.5
  1911.     .dc.s    23.6552646410364842728276505249/VOL    ;TL=83.5
  1912.     .dc.s    25.8396627912754194945564937378/VOL    ;TL=82.5
  1913.     .dc.s    28.2210597798606648847674248799/VOL    ;TL=81.5
  1914.     .dc.s    30.8172218470289422448988826375/VOL    ;TL=80.5
  1915.     .dc.s    33.6475174723743143620728005205/VOL    ;TL=79.5
  1916.     .dc.s    36.7330618719913062790308049138/VOL    ;TL=78.5
  1917.     .dc.s    40.0968745270195300569385457903/VOL    ;TL=77.5
  1918.     .dc.s    43.7640509188201426903516795659/VOL    ;TL=76.5
  1919.     .dc.s    47.7619497520020175495666327316/VOL    ;TL=75.5
  1920.     .dc.s    52.1203970620614939019679680501/VOL    ;TL=74.5
  1921.     .dc.s    56.8719087303660091704604737974/VOL    ;TL=73.5
  1922.     .dc.s    62.0519330665385781521145446469/VOL    ;TL=72.5
  1923.     .dc.s    67.6991152680114780690122777743/VOL    ;TL=71.5
  1924.     .dc.s    73.8555857297305391028174139176/VOL    ;TL=70.5
  1925.     .dc.s    80.567274354923766077463525079/VOL    ;TL=69.5
  1926.     .dc.s    87.884253211827079467601961444/VOL    ;TL=68.5
  1927.     .dc.s    95.8611100927329297097983146142/VOL    ;TL=67.5
  1928.     .dc.s    104.557355762272086666604989389/VOL    ;TL=66.5
  1929.     .dc.s    114.037867933174996988874096728/VOL    ;TL=65.5
  1930.     .dc.s    124.373375281761810792360717713/VOL    ;TL=64.5
  1931.     .dc.s    135.640985114123682928968241141/VOL    ;TL=63.5
  1932.     .dc.s    147.924758619610783711874040175/VOL    ;TL=62.5
  1933.     .dc.s    161.316338003264118662012682439/VOL    ;TL=61.5
  1934.     .dc.s    175.91563017586737016906831082/VOL    ;TL=60.5
  1935.     .dc.s    191.831552102239013254268117846/VOL    ;TL=59.5
  1936.     .dc.s    209.182843368381805915081516772/VOL    ;TL=58.5
  1937.     .dc.s    228.098952029588185086788174853/VOL    ;TL=57.5
  1938.     .dc.s    248.721000348307378065894196923/VOL    ;TL=56.5
  1939.     .dc.s    271.202837626591836473127625685/VOL    ;TL=55.5
  1940.     .dc.s    295.712187987703418455479657691/VOL    ;TL=54.5
  1941.     .dc.s    322.431901669821093416624163188/VOL    ;TL=53.5
  1942.     .dc.s    351.561319167036500802735824364/VOL    ;TL=52.5
  1943.     .dc.s    383.317758394712735100073451992/VOL    ;TL=51.5
  1944.     .dc.s    417.938135974096105603800981463/VOL    ;TL=50.5
  1945.     .dc.s    455.680734731657619560311176809/VOL    ;TL=49.5
  1946.     .dc.s    496.827130599465368014126536802/VOL    ;TL=48.5
  1947.     .dc.s    541.684293292088871985834879115/VOL    ;TL=47.5
  1948.     .dc.s    590.586876431983712271424749932/VOL    ;TL=46.5
  1949.     .dc.s    643.899714208671470375279717095/VOL    ;TL=45.5
  1950.     .dc.s    702.020543197860471085276864557/VOL    ;TL=44.5
  1951.     .dc.s    765.382969646442293351473329926/VOL    ;TL=43.5
  1952.     .dc.s    834.459704360579453503644510759/VOL    ;TL=42.5
  1953.     .dc.s    909.766089330533198876086216484/VOL    ;TL=41.5
  1954.     .dc.s    991.863942402361228788667663138/VOL    ;TL=40.5
  1955.     .dc.s    1081.365748679380861961477936/VOL    ;TL=39.5
  1956.     .dc.s    1178.93922992304554196405102188/VOL    ;TL=38.5
  1957.     .dc.s    1285.31232604291989446586629555/VOL    ;TL=37.5
  1958.     .dc.s    1401.27862583979950662716251909/VOL    ;TL=36.5
  1959.     .dc.s    1527.70328751764223781857663468/VOL    ;TL=35.5
  1960.     .dc.s    1665.5294931338627156897488258/VOL    ;TL=34.5
  1961.     .dc.s    1815.78548514095026640351697899/VOL    ;TL=33.5
  1962.     .dc.s    1979.5922375150208047330806513/VOL    ;TL=32.5
  1963.     .dc.s    2158.17181870120319742689671051/VOL    ;TL=31.5
  1964.     .dc.s    2352.85650876701014029883333078/VOL    ;TL=30.5
  1965.     .dc.s    2565.09873878155778522410724553/VOL    ;TL=29.5
  1966.     .dc.s    2796.48192657265491248199773763/VOL    ;TL=28.5
  1967.     .dc.s    3048.73228970114479865460595307/VOL    ;TL=27.5
  1968.     .dc.s    3323.73172378234166441939201873/VOL    ;TL=26.5
  1969.     .dc.s    3623.53184223234864089378212631/VOL    ;TL=25.5
  1970.     .dc.s    3950.36928218177063773948287354/VOL    ;TL=24.5
  1971.     .dc.s    4306.68239074548589684115983782/VOL    ;TL=23.5
  1972.     .dc.s    4695.12941613518669485347126867/VOL    ;TL=22.5
  1973.     .dc.s    5118.60833932817044973697472269/VOL    ;TL=21.5
  1974.     .dc.s    5580.27849424511390321500428998/VOL    ;TL=20.5
  1975.     .dc.s    6083.5841377326051440943025558/VOL    ;TL=19.5
  1976.     .dc.s    6632.28014519258580843443783642/VOL    ;TL=18.5
  1977.     .dc.s    7230.46002355909104088013467171/VOL    ;TL=17.5
  1978.     .dc.s    7882.58645061107694579424130964/VOL    ;TL=16.5
  1979.     .dc.s    8593.52456845767317268842945202/VOL    ;TL=15.5
  1980.     .dc.s    9368.57827957950273780424098716/VOL    ;TL=14.5
  1981.     .dc.s    10213.5298162100638634218940676/VOL    ;TL=13.5
  1982.     .dc.s    11134.6828782616857318678731891/VOL    ;TL=12.5
  1983.     .dc.s    12138.9096616234391064200347939/VOL    ;TL=11.5
  1984.     .dc.s    13233.7021276822217581181003555/VOL    ;TL=10.5
  1985.     .dc.s    14427.2278965595778103896091502/VOL    ;TL=9.5
  1986.     .dc.s    15728.3911810517073979974427202/VOL    ;TL=8.5
  1987.     .dc.s    17146.8992158659251228994846942/VOL    ;TL=7.5
  1988.     .dc.s    18693.3346777440880475645318505/VOL    ;TL=6.5
  1989.     .dc.s    20379.2346367580935101556176918/VOL    ;TL=5.5
  1990.     .dc.s    22217.1766277878845583893145831/VOL    ;TL=4.5
  1991.     .dc.s    24220.8724843120081411265634579/VOL    ;TL=3.5
  1992.     .dc.s    26405.2706345509433628554066708/VOL    ;TL=2.5
  1993.     .dc.s    28786.6676231361887530663378129/VOL    ;TL=1.5
  1994.                             ;0は使わない
  1995. *    .dc.s    31382.8296903044661131977955705/VOL    ;TL=0.5
  1996.     .dc.s    9999999999.0    ;番兵
  1997.  
  1998.     .bss
  1999. ;PCM→OPM変換テーブル
  2000. pcm2tl_table::    .ds.b    65536
  2001.  
  2002.